package com.lili.collection.core.enums;

import cn.hutool.core.util.StrUtil;
import com.lili.collection.core.utils.DateConvertUtil;
import com.lili.collection.core.utils.StrCutUtil;
import com.alibaba.fastjson2.JSON;
import lombok.Getter;

import java.math.BigDecimal;

/**
 * 字段类型枚举
 *
 * @author: lili
 * @since: 2022/12/6 21:02
 */
public enum FieldType {
    /**
     * 字符串
     */
    STRING("字符串", "1"),
    /**
     * 整数
     */
    INTEGER("整数", "2"),
    /**
     * 小数
     */
    DOUBLE("小数", "3"),

    /**
     * 金额
     */
    DECIMAL("金额", "4"),
    /**
     * 布尔
     */
    BOOLEAN("布尔", "5"),
    /**
     * 日期
     */
    DATE("日期", "6"),
    /**
     * 对象
     */
    OBJECT("对象", "7"),
    /**
     * 数组
     */
    ARRAY("数组", "8"),

    /**
     * 基本数值类型
     */
    BASE("基本数值类型", "9"),

    /**
     * 基于基本类型的数组类型
     */
    ARRAY_BASE("数组/基本类型", "10");

    /**
     * 字段名称
     */
    @Getter
    private final String name;

    /**
     * 枚举码值
     */
    @Getter
    private final String code;

    FieldType(String name, String code) {
        this.name = name;
        this.code = code;
    }

    public boolean isBaseType(){
        switch (this){
            case OBJECT:
            case ARRAY:
                return false;
            default:
                return true;
        }
    }

    public boolean isArray(){
        switch (this){
            case ARRAY:
                return true;
            default:
                return false;
        }
    }

    public boolean isObject(){
        switch (this){
            case OBJECT:
                return true;
            default:
                return false;
        }
    }

    public static FieldType codeOf(String code) {
        for (FieldType value : FieldType.values()) {
            if (StrUtil.equals(value.getCode(), code))
                return value;
        }
        throw new IllegalArgumentException("给定的code不存在");
    }

    public Object convert(String value){
        try {
            switch (this){
                case STRING:
                    return value;
                case INTEGER:
                    return Integer.valueOf(value);
                case DOUBLE:
                    return Double.valueOf(value);
                case DECIMAL:
                    return new BigDecimal(value);
                case BOOLEAN:
                    return Boolean.valueOf(value);
                case DATE:
                    return DateConvertUtil.generateDateByStr(value);
                case OBJECT:
                    return JSON.parseObject(value);
                case ARRAY:
                    return JSON.parseArray(value);
                default:
                    throw new IllegalArgumentException("不支持该类型【"+this+"】转换");
            }
        } catch (Exception e) {
            throw new RuntimeException(StrCutUtil.getCutLengthData(e.toString()));
        }
    }
}
